
use crate::domain::App;
use crate::repository;
use crate::database;


/// 添加应用
///
/// 根据名称和URL添加应用
///
/// # 参数列表
/// * `name`        应用名称           String
/// * `url`         应用URL           String
///
/// # 返回结果
/// * `app`         添加成功的应用信息   App
/// * `error`       添加失败的错误信息   String
#[tauri::command]
pub async fn add_app(name: String, url: String, icon: String, description: String) -> Result<App, String> {
    let conn = database::init_db().map_err(|e| format!("数据库初始化失败: {}", e))?;
    let app_id = repository::add_app(&conn, &name, &url, &icon, &description).map_err(|e| e.to_string())?;
    Ok(App { id: app_id, name, url, icon, description })
}

/// 获取应用列表
///
/// 获取所有应用信息
///
/// # 返回结果
/// * `apps`        应用列表           `Vec<App>`
/// * `error`       获取失败的错误信息   String
#[tauri::command]
pub async fn get_apps() -> Result<Vec<App>, String> {
    let conn = database::init_db().map_err(|e| format!("数据库初始化失败: {}", e))?;
    repository::get_apps(&conn).map_err(|e| format!("获取应用列表失败: {}", e))
}

/// 获取应用
///
/// 根据应用ID获取应用信息
///
/// # 参数列表
/// * `id`          应用ID           String
///
/// # 返回结果
/// * `app`         应用信息           App
/// * `error`       获取失败的错误信息   String
#[tauri::command]
pub async fn get_app(id: String) -> Result<App, String> {
    let conn = database::init_db().map_err(|e| format!("数据库初始化失败: {}", e))?;
    repository::get_app(&conn, &id).map_err(|e| format!("获取应用失败: {}", e))
}

/// 编辑应用
///
/// 编辑应用ID更新应用信息
///
/// # 参数列表
/// * `id`          应用ID           String
/// * `name`        应用名称           String
/// * `url`         应用URL           String
///
/// # 返回结果
/// * `app`         编辑成功的应用信息   App
/// * `error`       编辑失败的错误信息   String
#[tauri::command]
pub async fn edit_app(app: App) -> Result<App, String> {
    let conn = database::init_db().map_err(|e| format!("数据库初始化失败: {}", e))?;
    log::info!("编辑应用: {:?}", app);
    repository::edit_app(&conn, &app.id, &app.name, &app.url, &app.icon, &app.description).map_err(|e| format!("编辑应用失败: {}", e))
}

/// 删除应用
///
/// 根据应用ID删除应用
///
/// # 参数列表
/// * `id`          应用ID           String
///
/// # 返回结果
/// * `()`          删除成功           ()
/// * `error`       删除失败的错误信息   String
#[tauri::command]
pub async fn delete_app(id: String) -> Result<(), String> {
    let conn = database::init_db().map_err(|e| e.to_string())?;
    repository::delete_app(&conn, &id).map_err(|e| e.to_string())?;
    Ok(())
}
